package cn.ghf.user.service.impl;

import cn.ghf.basic.exception.MyException;
import cn.ghf.basic.util.StrUtils;
import cn.ghf.user.domain.User;
import cn.ghf.user.mapper.UserMapper;
import cn.ghf.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService{

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 手机验证码功能
     * @param
     */
    @Override
    public void sendSmsCode(Map<String,String> map) {

        //从map中获取phone，type
        String phone = map.get("phone");
        String type = map.get("type");

        //1.判断phone是否为空，为空，抛出
        if(StringUtils.isEmpty(phone)){
            throw new MyException("电话不能为空");
        }
        //注册
        if(type.equals("register")){
            //2.判断phone是否已注册，如果注册了，抛出
            User user=userMapper.loadByPhone(phone);
            if(user!=null){
                throw new MyException("用户已注册，请直接登录");
            }
            sendCode(phone,type);
        }else if(type.equals("binder")){ //微信绑定
            sendCode(phone,type);
        }

    }

    public void sendCode(String phone,String type){
        //(register+phone,code+时间戳)
        //从redis中获取值
        Object obj = redisTemplate.opsForValue().get(type+":" + phone);
        //如果有值，
        String code = "";
        if(obj!=null){
            String time = obj.toString().split(":")[1];
            //判断是否超过一分钟，如果没有超过一分钟，抛出
            if(System.currentTimeMillis()-Long.valueOf(time) < 60*1000){
                throw new MyException("一分钟内不能重复提交");
            }else{ //超过一分钟，使用当前验证码，重新设置过期时间 3分钟
                code = obj.toString().split(":")[0];
                redisTemplate.opsForValue().set(
                        type+":" + phone,  //key
                        code+":"+System.currentTimeMillis(),  //value
                        3, //时间
                        TimeUnit.MINUTES); //分钟
            }
        }else{
            //如果没有值，重新生成验证码，set到redis中
            //获取验证码
            code = StrUtils.getComplexRandomString(4);
            redisTemplate.opsForValue().set(
                    type+":" + phone,  //key
                    code+":"+System.currentTimeMillis(),  //value
                    3, //时间
                    TimeUnit.MINUTES); //分钟
        }
        //发送验证码到手机
        System.out.println("您的验证码是:"+ code);
    }
}
